package controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * FrontController
 * 1. 모든 클라이언트 요청을 받는 앞단 컨트롤러
 * 2. 컨트롤러들의 공통 로직을 처리하는 컨트롤러
 * 3. 그래서 프론트컨트롤러는 하나다. 
 */
public class FrontController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
	}
    
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	//컨트롤러들 공통 사전 작업(구현)
		request.setCharacterEncoding("UTF-8");	
	// 사용자가 요청한 작업을 처리하는 컨트롤러 로직(호출)
		String command = request.getParameter("command");
		
		Controller controller = null;
		if(command.equals("req1")){
			//만약 클라이언트가 넘겨준 command네임의 벨류값이 req1이라면
			//controller타입의 Request1Controller 객체를 생성해라.
			controller = new Request1Controller();
		}else if(command.equals("req2")){
			
		}
		try{
			//그리고 그 객체의 handelRequest메소드의 인자로 request와 response를 넘겨주고 그 값을 갖는 AttributeAndview 객체 av를 생성한다. 
//			다시 설명하면 위에서 사용자 요청에 의해서 만들어진 controller객체의 리턴타입이 AttributeAndView였기 때문에 핸들리퀘스트에 넘겨준 request,reponse에 대한 결과
//			는 반드시 AttributeAndView타입으로 받아와야 하는거지!
			AttributeAndView av = controller.handleRequest(request, response);
			//컨트롤러들 공통 사후 작업(구현)
			//ex) 응답처리, 처리결과 로그(기록) 등등
			if(av.isRedirect()){//리다이렉트방식으로 이동
				//그래서 만약 av객체의 리 다이렉트 방식이 리다이렉트 방식이라면 그쪽으로 응답을 처리할 수 있도록 넘긴다. 
				response.sendRedirect(av.getUrl());
			}else{//요청 디스패치 방식으로 이동
				RequestDispatcher rdp = request.getRequestDispatcher(av.getUrl());
				rdp.forward(request, response);
				
			}
		}catch(Exception e){
			e.printStackTrace();
			throw new ServletException(e);//처리를 Container에게 맡긴다. 
		}
	}

}
